home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / Search Example / TTY_Messages.c < prev    next >
C/C++ Source or Header  |  1994-03-23  |  4KB  |  191 lines

  1. /** FILE: TTY_Messages.c **/
  2. /** Manage scrolling message area **/
  3.  
  4. #define DEBUG 0 /*turn on for main program*/
  5. #define MPW_C 0 /*turn off for lightspeed*/
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <GestaltEqu.h>
  10. #include <AppleEvents.h>
  11.  
  12. #include <Types.h>
  13. #include <Memory.h>
  14. #include <Windows.h>
  15. #include <Dialogs.h>
  16. #include <Menus.h>
  17. #include <Fonts.h>
  18. #include <Events.h>
  19. #include <OSEvents.h>
  20. #include <Desk.h>
  21. #include <ToolUtils.h>
  22.  
  23. #include "TTY_Messages.h"
  24.  
  25. int MSG_FONT = monaco;
  26. int MSG_FONT_SIZE = 9;
  27.  
  28. #define MSG_SIZE 1024  /*** Increase for larger messages ***/
  29.  
  30. Rect msgBounds;
  31. Rect topBounds;
  32.  
  33. int lineIndex;
  34. char topLine[100];
  35.  
  36. #define maxTElines 100    /*Max lines in TErec before deletion*/
  37. #define minTElines 40    /*Number of lines in TErec after deletion*/
  38. #define maxint        32767
  39.  
  40.  
  41. TEHandle  msgEdit;    /*TErec for one and only message area*/
  42. WindowPtr ttyWin;    /*Window containing the message area*/
  43. Rect      destRect;    /*Destination Rect for TE stuff*/
  44. Rect      viewRect;    /*TE view rectangle */
  45. int          fontNum;    /*Font number of Venice 12 */
  46. /****************************/
  47.  
  48.  
  49. TTY_Die()
  50. {
  51.     ExitToShell();
  52. }
  53.  
  54. /****************************/
  55.  
  56. void TTY_InitMessages(WindowPtr theWin, Rect r, int font, int font_size)
  57. /* Init for programs with windows already */
  58. {
  59. /*    SetRect(&msgBounds,MSG_LEFT, MSG_TOP, MSG_LEFT+MSG_X_DIM, MSG_TOP+MSG_Y_DIM);*/
  60.     SetRect(&msgBounds,r.left,r.top,r.right,r.bottom);
  61.     lineIndex = 0;
  62. /**/
  63.     MSG_FONT = font;
  64.     MSG_FONT_SIZE = font_size;
  65.     ttyWin = theWin;
  66.     destRect = msgBounds;
  67.     SetPort(ttyWin);
  68.     viewRect = destRect;
  69.     InsetRect(&viewRect,0,4);
  70.     InsetRect(&destRect,4,4);
  71.     TextFont(MSG_FONT);
  72.     TextSize(MSG_FONT_SIZE);
  73.     msgEdit = TENew(&destRect, &viewRect);
  74.     (**msgEdit).crOnly = 1;            
  75.     TESetJust(0, msgEdit);            
  76.     TEAutoView(1, msgEdit);
  77. }
  78.  
  79.  
  80. /****************************/
  81.  
  82. void TTY_SAInitMessages()
  83. /** Initialization for stand-alone, dumb tty applications. **/
  84. /** Should be the FIRST call in your main program. **/
  85. {
  86. Rect r;
  87.     MaxApplZone();
  88.     MoreMasters();
  89. #if MPW_C
  90.     InitGraf(&qd.thePort);
  91. #else
  92.     InitGraf(&thePort);
  93. #endif
  94.     InitFonts();
  95.     FlushEvents(everyEvent,0);
  96.     InitWindows();
  97.     InitMenus();
  98.     TEInit();
  99.     InitDialogs(TTY_Die);
  100.     InitCursor();
  101.     SetRect(&r,5,40,512,460);
  102.     ttyWin = NewWindow(NULL, &r, "\pDebug", 1, 0, (Ptr) -1, 0, 0);
  103.     OffsetRect(&r,0,-40);
  104.     InsetRect(&r,2,2);
  105.     TTY_InitMessages(ttyWin, r, MSG_FONT, MSG_FONT_SIZE);
  106. }
  107.  
  108. /*********************/
  109.  
  110. void TTY_RedrawMessages()
  111. /*repaint the message area*/
  112. {
  113. Rect r;
  114.     SetPort(ttyWin);
  115.     r=msgBounds;
  116.     InsetRect(&r,0,-1);
  117.     EraseRect(&r);
  118.     InsetRect(&r,-1,-1);
  119.     FrameRect(&r);
  120.     
  121.     (**msgEdit).txFont = MSG_FONT;
  122. /**/        TEUpdate(&viewRect, msgEdit);/**/
  123. }
  124.  
  125. /*********************/
  126.  
  127. void TTY_WriteMessage(char *str)
  128. /** writes a message to the debug window, adding a CR at the end **/
  129. {
  130. EventRecord event;
  131.     int startPos;
  132.     char msg[MSG_SIZE]; 
  133.  
  134.     SetPort(ttyWin);
  135.     TESetSelect(maxint, maxint, msgEdit);
  136. #if MPW_C
  137.     sprintf(msg,"%s\n",str);
  138. #else
  139.     sprintf(msg,"%s\r",str);
  140. #endif
  141.     TEInsert(msg, strlen(msg), msgEdit);
  142.     startPos = (**msgEdit).lineStarts[(**msgEdit).nLines] - 1;
  143.     TESetSelect(startPos, startPos, msgEdit);
  144.     if ((**msgEdit).nLines >= maxTElines) 
  145.     {
  146.         TESetSelect(0, (**msgEdit).lineStarts[maxTElines-minTElines]-1, msgEdit);
  147.         TEDelete(msgEdit);
  148.         startPos = (**msgEdit).lineStarts[(**msgEdit).nLines] - 1;
  149.         TESetSelect(startPos, startPos, msgEdit);
  150.     }/**/
  151.     TESelView(msgEdit);
  152.     if (EventAvail(everyEvent,&event));
  153. }
  154.  
  155. /**********************/
  156.  
  157. void TTY_ClearMessages()
  158. /** clear out top line and message area*/
  159. {
  160.     TESetSelect(0, 32767, msgEdit);
  161.     TEDelete(msgEdit);
  162. }
  163.  
  164.  
  165. /**********************/
  166.  
  167. void TTY_Click()
  168. /*wait for a mouse click*/
  169. {
  170. EventRecord event;
  171.     while (!Button())
  172.         if (EventAvail(everyEvent,&event));
  173.     while (Button());
  174. }
  175.  
  176. #if DEBUG
  177. main()
  178. {
  179. char s[80];
  180. int i,j;
  181.  
  182.     TTY_SAInitMessages();
  183.     for (j=0;j<5;j++) {
  184.         for (i=0;i<10;i++) {
  185.             sprintf(s,"Line %d",i);
  186.             TTY_WriteMessage(s);
  187.         }
  188.         TTY_Click();
  189.     }
  190. }
  191. #endif